package cn.tedu.charging.device.canal;

import cn.tedu.charging.device.pojo.po.StationCanalPO;
import cn.tedu.charging.device.repository.DeviceRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import top.javatool.canal.client.annotation.CanalTable;
import top.javatool.canal.client.handler.EntryHandler;

/**
 * 场站数据 Mysql 和 Redis 同步处理器
 * 管理员 在 后台管理系统
 * 对 场站信息进行 修改 新增 更新 删除
 * 会修改  charging_station
 * 表变化了后 mysql 会写入 binlog
 * canal 会 监听 binlog 文件 进行解析
 * 会通知 本类 StationSyncHandler
 *
 * 新增 会调用 insert 在redis插入数据  数据库的数据就和redis的数据一致
 * 修改 会调用 update 在redis更新数据  数据库的数据就和redis的数据一致
 * 删除 会调用 delete 在redis删除数据  数据库的数据就和redis的数据一致
 *
 */
@Slf4j
@Component
@CanalTable("charging_station")
public class StationSyncHandler
        implements EntryHandler<StationCanalPO> {

    @Autowired
    private DeviceRepository deviceRepository;

    @Override
    public void insert(StationCanalPO stationCanalPO) {
        log.debug("<StationSyncHandler> 收到了数据库表 " +
                "charging_station 发生插入数据:{}",stationCanalPO);
        log.debug("保存数据到Redis:{}",stationCanalPO);
        deviceRepository.saveStation(stationCanalPO);
        EntryHandler.super.insert(stationCanalPO);
    }

    @Override
    public void update(StationCanalPO before, StationCanalPO after) {
        log.debug("<StationSyncHandler> 收到了数据库表 charging_station" +
                "发生了更新事件 before:{},after:{}",before, after);
        log.debug("更新Redis:{}",after);
        deviceRepository.updateStation(before, after);
        EntryHandler.super.update(before, after);
    }

    @Override
    public void delete(StationCanalPO stationCanalPO) {
        log.debug("<StationSyncHandler> 收到了数据库表 " +
                "charging_station 发生了删除事件:{}",stationCanalPO);
        log.debug("删除Redis:{}",stationCanalPO);
        deviceRepository.deleteStation(stationCanalPO);
        EntryHandler.super.delete(stationCanalPO);
    }
}
